import tabBar from "@/pages/tabbarModule";
export default class Router {
  constructor() {}

  static routerFilter(path: string): void {
    if (tabBar.includes(path)) {
      console.log("push call inner");
      throw new Error("[[语法错误]]: 请勿使用 push 方法跳转 tabBar 页面");
    }
  }

  // 对象数据转为路由路径参数
  static queryString(obj = {} as any): string {
    if (Object.keys(obj).length === 0) return "";
    let str = "?";
    for (let key in obj) {
      str += `${key}=${obj[key]}` + "&";
    }
    return str.substring(0, str.length - 1);
  }

  /**
   * @description uni.navigateTo 封装
   * @param { string } path 路由地址
   * @param { object } params 路由参数
   * @param { object } events 页面间通信接口，用于监听被打开页面发送到当前页面的数据。
   */
  static push(
    path: string,
    params?: any,
    events?: any,
    success?: (res: any) => void
  ): void {
    // 为 push 方法添加路由守卫，防止开发者使用 push 方法跳转到 tabBar 页面
    Router.routerFilter(path);
    uni.navigateTo({
      url: path + Router.queryString(params),
      events: events,
      success,
      fail({ errMsg }) {
        Router.replace(path, params);
        console.log(
          `%c[[路由跳转失败：调用 重定向路由]]%c ${errMsg}`,
          "color: #00C9A7;",
          "font-weight:bold;"
        );
      },
    });
  }

  /**
   * @description uni.redirectTo 封装，当前页面出栈，新页面入栈
   * @param { string } path 路由地址
   * @param { object } params 路由参数
   */
  static replace(path: string, params?: any): void {
    uni.redirectTo({
      url: path + Router.queryString(params),
      fail({ errMsg }) {
        console.log(
          `%c[[路由重定向失败：]]%c ${errMsg}`,
          "color: #00C9A7;",
          "font-weight:bold;"
        );
      },
    });
  }

  /**
   * @description uni.navigateBack 封装，页面不断出栈，直到目标返回页
   * @param { number } number 页面栈返回层级，[1]
   */
  static back(number = 1 as number): void {
    uni.navigateBack({
      delta: number,
      fail({ errMsg }) {
        console.log("tabBar", tabBar);
        uni.showLoading({
          title: "跳转中..",
          mask: true,
        });
        Router.switchTab(tabBar[1]);
        console.log(
          `%c[[路由后退失败：]]%c ${errMsg}`,
          "color: #00C9A7;",
          "font-weight:bold;"
        );
      },
    });
  }

  /**
   * @description uni.reLaunch 封装，页面全部出栈，只留下新的页面
   * @param { string } path 路由路径
   * @param { object } params 路由参数
   */
  static reLaunch(path: string, params?: any): void {
    uni.reLaunch({
      url: path + Router.queryString(params),
      fail({ errMsg }) {
        console.log(
          `%c[[路由 relaunch 失败：]]%c ${errMsg}`,
          "color: #00C9A7;",
          "font-weight:bold;"
        );
      },
    });
  }

  /**
   * @description uni.switchTab 封装，页面全部出栈，只留下新的 Tab 页面
   * @param 路径后不能带参数
   * @param { string } path 路由路径
   */
  static switchTab(path: string): void {
    if (!tabBar.includes(path)) {
      throw new Error("[[语法错误]]: switchTab 方法只能跳转 tabBar 页面");
    }

    uni.switchTab({
      url: path,
      fail({ errMsg }) {
        console.log(
          `%c[[路由 switchTab 失败：]]%c ${errMsg}`,
          "color: #00C9A7;",
          "font-weight:bold;"
        );
      },
    });
  }
}
